package protocol;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageCodec;
import lombok.extern.slf4j.Slf4j;
import message.Message;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.List;

@Slf4j
public class MessageCodec extends ByteToMessageCodec<Message> {
    @Override
    protected void encode(ChannelHandlerContext channelHandlerContext, Message message, ByteBuf byteBuf) throws Exception {
//        message -> byte
//        魔数
        byteBuf.writeBytes(new byte[]{1,2,3,4});
//        版本号
        byteBuf.writeByte(1);
//        序列化方式
        byteBuf.writeByte(0);
//        消息类型
        byteBuf.writeByte(message.getMessageType());
        byteBuf.writeInt(message.getSequenceId());
//        消息对齐
        byteBuf.writeByte(0xff);

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(message);
        byte[] bytes = bos.toByteArray();
//        消息长度
        byteBuf.writeInt(bytes.length);
        byteBuf.writeBytes(bytes);
    }

    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
//        魔术
        int magicNum = byteBuf.readInt();
        byte version = byteBuf.readByte();
        byte serializerType= byteBuf.readByte();
        byte messageType= byteBuf.readByte();
        int sequenceId= byteBuf.readInt();
//        对齐
        byteBuf.readByte();
        int length = byteBuf.readInt();
        byte[] bytes = new byte[length];
        byteBuf.readBytes(bytes, 0, length);
        if(serializerType == 0){
            ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
            Message message = (Message) ois.readObject();
            log.debug("{} {} {} {} {} {} ",magicNum, version, serializerType, messageType, sequenceId, message);
            list.add(message);
        }

    }
}
